package skyinline.JDBC;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class J01_helloJDBC {
	/**
	 * JDBC
	 * 		데이터베이스에 접근하고 조작하는 것은 아누 중요한 주제중의 하나임
	 * 		데이터베이스에는 여러 브랜드가 있음 - Oracle, MySQL, MSSQL 등등
	 * 		모든 데이터베이스 서버는 독점적인 방식을 통해 접근하고 관리하도록 허용됨
	 * 		따라서, 각각의 데이터베이스에 접근하려면 각 브랜드가 제공하는 기술을 사용해야 함
	 * 
	 * 		운좋게도 자바에서는 서로 다른 데이터베이스에 통일된 방식으로 접근하게 하는 JDBC 를 제공함
	 * 		Java 7은 JDBC 4.1을 제공
	 * 		JDBC Core API : java.sql 패키지
	 * 		JDBC Optional API : javax.sql 패키지
	 * 
	 * 	JDBC Driver
	 * 		데이터 베이스 제조사가 제공하는 라이브러리
	 * 		각 제조사는 자신만의 독점적인 기술을 이 라이브러리에 포함시켜 둠
	 * 		이것을 JDBC API 라는 동일된 코드를 이용해서 데이터베이스를 제어할 수 있음
	 * 		
	 * 	데이터베이스 접근 5단계
	 * 		1. 데이터베이스에 접근하기 위해 JDBC 드라이버 불러오기
	 *  	2. 데이터베이스 연결 얻기
	 *  	3. 실행할 SQL 문장을 만들기 위해
	 *  		Statement / PreparedStatement 객체 생성
	 *  	4. SQL 문장을 실행하고 데이터베이스로부터 넘어온 결과를 처리하기 위해 ResulSet 객체를 생성
	 *  	5. 모든 처리가 끝나면 JDBC 자원 해제
	 *  
	 * 	Oracle JDBC 드라이버 등록
	 * 		Ojdbc6.jar 를 라이브러리로 등록
	 */
	
	public static void main(String[] args) {
		// Oracle 데이터베이스 연결정보
		final String DRV = "oracle.jdbc.driver.OracleDriver";
		final String URL = "jdbc:oracle:thin:@112.216.253.125:1521:xe";
		final String USR = "skyinline";
		final String PWD = "123456";
		
		// MySQL 데이터베이스 연결정보
		// DRV = "com.mysql.jdbc.Driver";
		// URL = "jdbc:mysql://112.216.253.125:3306/zipcode";
		// USR = "zipcode";
		// PWD = "zipcode";
		
		//	데이터베이스 작업용 객체 정의
		Connection conn = null;								// 연결
		PreparedStatement pstmt = null;			// 질의
		ResultSet rs = null;										// 결과
		
		String SQL = "select * from employees";
		
		//	JDBC 관련코드 작성시 예외처리를 위해
		// try - catch - finally 를 작성해둘 것!
		try {
			//	1. JDBC 드라이버 불러오기
			//	Class : 클래스에 대한 객체를 동적으로 생성
			Class.forName( DRV );
			//	2. 데이터베이스 연결
			conn = DriverManager.getConnection( URL, USR, PWD );
			//	3. 실행할 SQL 질의 작성
			pstmt = conn.prepareStatement( SQL );
			//	4a. SQL 질의를 실행하고 결과를 받음
			rs = pstmt.executeQuery();
			//	4b. 받은 결과 처리
			if ( rs.next() ) {													// 결과에 데이터가 존재하면!
				do {																	// 출력할 데이터가 없을 때까지 반복
					// rs.getXxx()
					System.out.print(rs.getString("employee_id"));
					System.out.print("\t\t");
					System.out.println(rs.getString( 4 ));					
				} while ( rs.next() );
			} else {																	// 결과에 데이터가 없으면
				System.err.println("데이터가 없습니다.");
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//	5. JDBC 객체 해제
			if ( rs != null ) try { rs.close(); rs = null; } catch ( Exception e ) {} 
			if ( pstmt != null ) try { pstmt.close(); pstmt = null; } catch ( Exception e ) {}
			if ( conn != null ) try { conn.close(); conn = null; } catch ( Exception e ) {}
		}
		
		
		
	}
	
}
